#include <string>
#include "node.h"
#include "conditional.h"
#include "empty.h"

namespace AST {

    // Construtor
    Conditional::Conditional(Node* expression, Node* bthen, Node* belse) {
        // Configurações
        this->_setExpression(expression)->_setThen(bthen)->_setElse(belse);
    };

    // Construtor Simplificado
    Conditional::Conditional(Node* expression, Node* bthen) {
        // Configurações
        this->_setExpression(expression)->_setThen(bthen);
    };

    // Expressão Condicional
    Conditional* Conditional::_setExpression(Node* expression) {
        // Configuração
        this->_expression = expression;
        // Encadeamento
        return this;
    };

    // Configura Resultado de Sucesso
    Conditional* Conditional::_setThen(Node* bthen) {
        // Configuração
        this->_then = bthen;
        // Encadeamento
        return this;
    };

    // Configura Resultado de Falha
    Conditional* Conditional::_setElse(Node* belse) {
        // Configuração
        this->_else = belse;
        // Encadeamento
        return this;
    };

    // Apresenta a Expressão Condicional
    Node* Conditional::getExpression() {
        // Apresentação
        return this->_expression;
    };

    // Apresenta o Bloco para Resultado em Sucesso
    Node* Conditional::getThen() {
        // Apresentação
        return this->_then;
    };

    // Apresenta o Bloco para Resultado em Falha
    Node* Conditional::getElse() {
        // Inicializado?
        if (this->_else == NULL) {
            // Configuração
            this->_setElse(new Empty());
        }
        // Apresentação
        return this->_else;
    };

    // Sobrescrita
    std::string Conditional::toString(int indent) {
        return this->getIndentSpaces(indent)
            + "Conditional\n"
            + this->getIndentSpaces(indent + 1) + "Expression\n"
                + this->getExpression()->toString(indent + 2) + "\n"
            + this->getIndentSpaces(indent + 1) + "Then\n"
                + this->getThen()->toString(indent + 2) + "\n"
            + this->getIndentSpaces(indent + 1) + "Else\n"
                + this->getElse()->toString(indent + 2);
    };

};

